这是一道二分答案结合优先队列的题目,自我感觉对二分和贪心都有一定的帮助,毕竟是USACO的题目。。。
大体说一下题意:你有n头奶牛,要进行一场表演,表演有一定的时间限制T,每头奶牛要表演a[i]个时间,你可以要求K头奶牛同时表演,求K的最小值。
题目思路:我们不妨设二分的左右变量为奶牛同时表演的数目,同一个函数来判断当前mid是否符合题意,如果符合则缩小r,反之则扩大l,最终答案即为l。
但是 _判断函数_ 怎么写?
如果按照模拟求解,显然会TLE,所以我们要进行相应的优化。
那我们不妨这样想,既然要求最小时间,那我们何不用一个小根堆来存放时间,先把mid个时间放进去,再把剩余(n-mid)个的时间加到排好序的小根堆里,同时进行判断,如果不符题意,直接return 0,处理完这一步后,我们再取小根堆里前mid个数值进行判断,通过这两步判断,没有return的肯定符合题意。
我们来思考一下,小根堆每次都要清零吗?
我们每次check,都会往原时间上加内容,所以肯定比原时间要大,由此小根堆不需要清零,这也是用小根堆的好处,清零会浪费大量的时间,极有可能会TLE。
那最后就是上代码了,
有思路的同学就不要往下看了。。。
1 |
|
祝大家( _Of course including me_ )RP++;